<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script type="text/javascript">
    // 创建函数对象的三种方式
    function sum(a,b){
        return a + b;
    }
    console.log(sum(1,2));

    var sum = function(a,b){
        return a + b;
    }
    console.log(sum(1,2));

    var sum = new Function('a','b','return a + b;');
    console.log(sum(1,2));
</script>
<script type="text/javascript">
    // 使用Function()构造器来创建函数
    var first = new Function(
        'a,b,c,d',
        'return arguments'
    );
    console.log(first(1,2,3,4));

    var second = new Function(
        'a,b,c',
        'd',
        'return arguments;'
    );
    console.log(second(1,2,3,4));

    var third = new Function(
        'a',
        'b',
        'c',
        'd',
        'return arguments;'
    )
    console.log(third(1,2,3,4));
</script>
<script type="text/javascript">
    // prototype属性的使用
    // 先创建一个简单的对象，对象中只有一个name属性和一个say方法
    // 这个验证很简单，因为每个新建函数都会有一个prototype属性，而该属性会指向一个新对象

    var ninja = {
        name: 'Ninja',
        say: function(){
            return 'I am a ' + this.name;
        }
    }

    function F(){};
    console.log(typeof F.prototype);

    // 如果我们现在对该prototype属性进行修改，就会发生一些有趣的现象：当前默认的空对象被直接替换成了其他对象。下面我们就将变量ninja赋值给这个prototype。

    F.prototype = ninja;

    // 现在，如果我们将F()当做一个构造器函数来创建对象baby_ninja，那么新对象baby_ninja就会拥有对F.prototype属性（也就是ninja）的访问权
    var baby_ninja = new F();
    console.log(baby_ninja.name);
    console.log(baby_ninja.say());
</script>
</body>
</html>
